var obj = new Object(); //用法1
obj.id = 1; //属性如果没有则新增否则替换f
obj.user_name = "张三";
obj["age"] = 19;
obj["sex"] = "男"; //赋值方式2
obj["obj_fun"] = function(){alert('对象里面的方法')};

//obj = {"id":2,"user_name":"李四","age":20,"sex":"男"}; //用法2

//函数的调用方式
function fun_custom(a,b){
    console.log("fun_custom,a="+a);
    console.log("fun_custom,b="+b);
    console.log("fun_custom,this=" + this);

    //arguments与this一样都是隐含参数、也可以通过arguments获取行参、如：获取a的value可以通过arguments[0]
    console.log("fun_custom_arguments获取,a="+arguments[0]);
    console.log("fun_custom_arguments获取,b="+arguments[1]);
}
fun_custom(); //直接调用、默认this是window
fun_custom.call(obj,1,2); //call调用可以改变this对应第一个参数,同时也可以进行单个传参
fun_custom.apply(obj,[1,2]); //apply调用可以改变this对应第一个参数,传参必须以数组方式传递

var date = new Date("12/18/2023 01:05:03"); //创建时间、详情参考w3c网站
console.log("date="+date);

console.log("随机生成数1~10：" + (Math.round(Math.random()*9)+1));
console.log("获取最大的数：" + (Math.max(10,30,5,20)));
console.log("ES6方式获取数组中最大的数：" + (Math.max(...[10,30,5,20])));
//同理获取最小数：Math.min(10,30,5,20); Math.min(...[10,30,5,20]);

var arrCustom = new Array(); //创建数组方式1
arrCustom.push("你好啊");
var arr = []; //创建数组方式2
arr[0] = function(){alert('数组方法');}; //数组赋值
arr[0](); //数组方法调用
arr[arr.length] = '张三'; //数组赋值、给新的下标赋值
arr.unshift("赵六","田七"); //向数组前面添加元素、可以添加多个
arr.push("李四","王五"); //向数组后面添加元素、可以添加多个
console.log("shift=" + arr.shift()); //获取数组中前面一个元素并删除
console.log("pop=" + arr.pop()); //获取数组中后面一个元素并删除
console.log("concat=" + arr.concat(["你好啊","我是谁"],"aa","bb")); //数组或字符串合并、返回新的数组
console.log("join=" + arr.join(",")); //将数组元素内容拼接并返回字符串、不写的话默认逗号
arr.reverse(); //数组元素本身进行位置反转、后面的放前面、前面的放后面
arr.sort((a,b) => a - b); //数组本身排序,正序: a-b、倒序：b-a
/*
    参数1：开始位置索引
    参数2：结束位置索引,不包含结束索引自己
            第二个参数可以省略、此时截取从开始索引到往后所有元素
            索引可以传一个负值，如果传一个负值，则从后往前算
            -1倒数第一个
            -2倒数第二个、以此类推
*/
console.log("slice=" + arr.slice(0,-1));

/*
    获取元素并同时删除元素、和在开始索引位置前新增元素
    参数1：开始位置索引
    参数2：删除数量
    往后参数都为新增元素、可忽略
    //该方法是个多功能的方法、支持（删除|获取|新增）

*/
console.log("splice=" + arr.splice(0, 2,"a","b","c"));


// for(var i = 0; i < arr.length; i++) {
//     console.log("for遍历：arr["+i+"] = "+arr[i]);
// }
// for(var key in arr) {console.log("遍历下标:%s", key);}
// for(var value of arr) {console.log("遍历下标:%s", value);}
// arr.forEach(function(value, index, obj){ //IE8及以下浏览器不支持该方法
//     console.log("forEach遍历：value=" + value + ",index=" + index + ", obj="+obj);
// });



console.log(arr); //打印


console.log("查询是否包含指定属性in方式", "user_name" in obj); //先在本对象中找、如果没有则会到父级原型对象中找、以此类推,直到Object对象
console.log("查询是否包含指定属性hasOwnProperty方式", obj.hasOwnProperty("user_name"));//只在本对象中找不会到父级中查找

console.log("obj.user_name属性:", obj.user_name); //获取单个属性、方式1
console.log("obj['user_name']属性:", obj['user_name']); //获取单个属性、方式2
obj.obj_fun(); //调用对象方法

for (var key in obj) { //遍历所有属性
    console.log("遍历所有属性:", obj[key]);
};


delete obj.user_name;     //删除单个属性
for (var key in obj) delete obj[key]; //删除所有属性

console.log("删除所有属性后:", obj);

//嵌套调用法
function fun1(f2){
    var fo = {"name":"fun1"};
    f2(fo);
}
function fun2(fo){
    console.log('我是fun2' + ",你是谁? 我是" + fo.name);
}
fun1(fun2); //调用

(function(a,b){
    alert('立即执行函数、初始加载执行一次');
})(1,2);

/*
1.创建一个构造对应函数、等价于java里面的类对象
2.构造对象函数就是一个普通函数,创建方式和普通函数没有区别
3.不同的就构造函数习惯首字母大写
4.普通函数是直接调用、而构造函数需要使用new关键字来调用
*/
function UserInfo(userName, age){
    this.userName = userName;
    this.age = age;
    this.getFun = function() { //内部方法设置
        console.log("对象内部方法getFun: " + this.userName);
    }
}
var userInfo = new UserInfo("张三", "29"); //创建对象、加上new是创建、不加new是直接调用
console.log(userInfo); //对象日志打印
userInfo.getFun(); //对象内部方法调用

//对象中的静态、翻译(原型)：关键字prototype等价于java里面的static、就是对象中的全局静态变量
UserInfo.prototype.sex = "我是全局静态属性sex"; //添加属性、关键字：prototype
UserInfo.prototype.getPrototypeFun = function(msg) { //添加方法、关键字：prototype
    console.log(msg + "全局静态方法getPrototypeFun： " + this.sex);
}

//调用静态
console.log("直接方式获取全局静态属性-sex:" + UserInfo.prototype.sex); //关键字：prototype
UserInfo.prototype.getPrototypeFun("直接方式调用"); //直接方式调用全局静态方法、关键字：prototype

console.log("对象方式获取全局静态属性-sex: " + userInfo.__proto__.sex); //关键字: __proto__
userInfo.__proto__.getPrototypeFun("对象方式调用"); //对象方式调用全局静态方法、关键字: __proto__

console.log("1、对象方式获取sex本对象中没有则自动找全局sex: " + userInfo.sex); //第一次不给对象内部中设置sex
userInfo.sex = "我是对象内部sex";   //给对象内部设置sex
console.log("2、对象方式获取sex本对象中没有则自动找全局sex: " + userInfo.sex); //获取方式优先寻找对象内部的sex、对象中没有则从全局静态中找

//JSON转换
// var objJson = JSON.parse('{"id":1, "name":"段永红"}'); //json字符串转对象
// var jsonStr = JSON.stringify(objJson);  //对象转json字符串
// alert("objJson.name:" + objJson.name + ", jsonStr: " + jsonStr);
// for (var key in objJson) { //遍历
//     alert("key: " + key + ", value: " + objJson[key]);
// };
